package com.itheima.service.impl;

import com.itheima.config.XmemcachedConfig;
import com.itheima.domain.SMSCode;
import com.itheima.service.SMSCodeService;
import com.itheima.utils.CodeUtils;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.exception.MemcachedException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

@Service
public class SMSCodeServiceImpl implements SMSCodeService {
    @Autowired
    private CodeUtils codeUtils;
    @Autowired
    private XmemcachedConfig xmemcachedConfig;

    /**
     * 将得到的验证码放入Xmemcache缓存中
     * @param tele
     * @return
     */
    @Override
    public String sendCodeToSMS(String tele) {
        String code = codeUtils.generator(tele);
        try {
            MemcachedClient memcachedClient = xmemcachedConfig.memcachedClient();
            memcachedClient.set(tele,0,code);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return code;
    }

    /**
     * 验证码验证
     * @param smsCode
     * @return
     */

    @Override
    public boolean checkCode(SMSCode smsCode) {
        String code = smsCode.getCode();
        String test_code=null;
        try {
            MemcachedClient memcachedClient = xmemcachedConfig.memcachedClient();
            test_code = memcachedClient.get(smsCode.getTele()).toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return code.equals(test_code);
    }

//    @Autowired
//    private CodeUtils codeUtils;
//
////    @Cacheable//这个注解既可以向缓存放数据，也可以取数据，但是验证码要是过时，就应该生成新的验证码，而不是去缓存中拿刚刚生成的
//    @Override
//    @CachePut(value = "SMScache",key = "#tele")
//    public String sendCodeToSMS(String tele) {
//
//        String code = codeUtils.generator(tele);
//        //返回值会传入到缓存中
//        return code;
//    }
//    //这个方法直接放在这个，我们在上面直接调用的话，方法上面的注解是不会执行的，注解想要执行，就必须要被spring容器加载到
//    //这个不能使用业务层的实现类调用，我们可以放在工具类的bean中，这样这个方法就能被spring容器加载到了
////    @Cacheable(value = "SMScache",key = "#tele")
////    public String get(String tele){
////        return null;
////    }
//
//
//    @Override
//    public boolean checkCode(SMSCode smsCode) {
//        String code = smsCode.getCode();
//        System.out.println(code);
//        String test_code = codeUtils.get(smsCode.getTele());
//        System.out.println(test_code);
//        return code.equals(test_code);
//    }



//    @Override
//    @CachePut(value = "smsCode",key="#tele")
//    public String sendCodeToSMS(String tele) {
//        String code = codeUtils.generator(tele);
//        return code;
//    }
//
//    @Override
//    public boolean checkCode(SMSCode smsCode) {
//        //取出内存中的验证码与传递过来的验证码比对，如果相同，返回true
//        String code = smsCode.getCode();
//        String cacheCode = codeUtils.get(smsCode.getTele());
//        return code.equals(cacheCode);
//    }


    //以下是springboot中使用xmemcached

//    @Autowired
//    private MemcachedClient memcachedClient;
//
//    @Override
//    public String sendCodeToSMS(String tele) {
//        String code = codeUtils.generator(tele);
//        try {
//            memcachedClient.set(tele,10,code);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return code;
//    }
//
//    @Override
//    public boolean checkCode(SMSCode smsCode) {
//        String code = null;
//        try {
//            code = memcachedClient.get(smsCode.getTele()).toString();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return smsCode.getCode().equals(code);
//    }


}














